home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 38 / Amiga Format CD38 (1999-03-15)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-04].iso / -seriously_amiga- / programming / other / cyberxxxsrc / decoder / txt / rgbtoham8.c < prev    next >
C/C++ Source or Header  |  1999-02-08  |  1KB  |  72 lines

  1. /*
  2. sc:c/sc opt txt/RGBtoHAM8.c
  3. */
  4.  
  5. #include "Decode.h"
  6.  
  7. #define abs(x) ((x)<0?-(x):(x))
  8. #define DELTA(x1,x2) abs((x1)-(x2))
  9. #define NUM_GUNS 3
  10.  
  11. /* /// "RGBtoHAM8()" */
  12. void __asm RGBtoHAM8(register __a0 uchar *rgb,
  13.                      register __a1 uchar *ham8,
  14.                      register __d0 ulong width,
  15.                      register __d1 ulong height)
  16. {
  17.   uchar oRed, oGreen, oBlue;
  18.   uchar dRed, dGreen, dBlue;
  19.   uchar red, green, blue;
  20.   ulong xp, yp;
  21.  
  22.   for (yp=height; yp>0; yp--) {
  23.     oRed=0;
  24.     oGreen=0;
  25.     oBlue=0;
  26.  
  27.     for (xp=width; xp>0; xp--) {
  28.       red=rgb[0] >> 2;
  29.       green=rgb[1] >> 2;
  30.       blue=rgb[2] >> 2;
  31.       rgb+=3;
  32.  
  33.       if ((red==oRed) && (green==oGreen) && (blue==oBlue)) {
  34.         switch (xp%NUM_GUNS) {
  35.           case 0:
  36.            *ham8++=0x80 | red;
  37.            break;
  38.           case 1:
  39.            *ham8++=0xC0 | green;
  40.            break;
  41.           case 2:
  42.            *ham8++=0x40 | blue;
  43.         }
  44.         continue;
  45.       }
  46.  
  47.       dRed=DELTA(red,oRed);
  48.       dGreen=DELTA(green,oGreen);
  49.       dBlue=DELTA(blue,oBlue);
  50.       if (dRed>dGreen) {
  51.         if (dRed>dBlue) {
  52.           *ham8++=0x80 | red;
  53.           oRed=red;
  54.         } else {
  55.           *ham8++=0x40 | blue;
  56.           oBlue=blue;
  57.         }
  58.       } else {
  59.         if (dGreen>dBlue) {
  60.           *ham8++=0xC0 | green;
  61.           oGreen=green;
  62.         } else {
  63.           *ham8++=0x40 | blue;
  64.           oBlue=blue;
  65.         }
  66.       }
  67.     }
  68.   }
  69. }
  70. /* \\\ */
  71.  
  72.